home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / XMODEM2.ASM < prev   
Assembly Source File  |  1993-05-04  |  13KB  |  432 lines

  1. ;*************************************;
  2. ; WASM Xmodem Support, File Transfers ;
  3. ; By Eric Tauck                       ;
  4. ;                                     ;
  5. ; XmdUpl  upload a file               ;
  6. ; XmdDwn  download a file             ;
  7. ;                                     ;
  8. ; Requires:                           ;
  9. ;                                     ;
  10. ;   BUFFER1.ASM                       ;
  11. ;   BUFFER2.ASM                       ;
  12. ;   BUFFER3.ASM                       ;
  13. ;   SERIAL1.ASM                       ;
  14. ;   STACK.ASM                         ;
  15. ;   XMODEM1.ASM                       ;
  16. ;*************************************;
  17.  
  18.         jmp     _xmodem2_end
  19.  
  20. _XMOD_BUF       EQU     4096    ;buffer size
  21.  
  22. _xmod_flg       DB      ?       ;flags
  23. _xmod_blk1      DW      ?       ;blocks transferred, low word
  24. _xmod_blk2      DW      ?       ;blocks transferred, high word
  25. _xmod_byt1      DW      ?       ;bytes transferred, low word
  26. _xmod_byt2      DW      ?       ;bytes transferred, high word
  27. _xmod_err       DW      ?       ;errors
  28. _xmod_last      DB      ?       ;last error
  29.  
  30. ;--- xmodem termination codes
  31.  
  32. XMODEM_MEMORY   EQU     0       ;not enough memory
  33. XMODEM_FILE     EQU     1       ;error read or writing file
  34. XMODEM_ABORT    EQU     2       ;user abort
  35.  
  36. ;========================================
  37. ; Initialize a transfer.
  38. ;
  39. ; In: CL= xmodem flags.
  40.  
  41. _xmod_init PROC NEAR
  42.         mov     _xmod_flg, cl   ;save flags
  43.         mov     _xmod_blk1, 0   ;zero blocks
  44.         mov     _xmod_blk2, 0
  45.         mov     _xmod_byt1, 0   ;zero bytes
  46.         mov     _xmod_byt2, 0
  47.         mov     _xmod_err, 0    ;zero errors
  48.         ret
  49.         ENDP
  50.  
  51. ;========================================
  52. ; Check with user.
  53. ;
  54. ; In: AL= action (0= handshake; 1=
  55. ;     waiting for block; 2= waiting for
  56. ;     reply).
  57.  
  58. _xmod_stat PROC NEAR
  59.         ror     al
  60.         ror     al
  61.         or      al, _xmod_flg   ;flags
  62.         mov     ah, _xmod_last  ;last error
  63.         mov     bx, _xmod_err   ;errors
  64.         mov     cx, _xmod_byt1  ;byte count low
  65.         mov     dx, _xmod_byt2  ;byte count high
  66.         call    XmdUsr          ;inform user of status
  67.         ret
  68.         ENDP
  69.  
  70. ;========================================
  71. ; Process error.
  72. ;
  73. ; In: AL= error.
  74.  
  75. _xmod_error PROC NEAR
  76.         inc     _xmod_err       ;increment errors
  77.         mov     _xmod_last, al  ;save error code
  78.         ret
  79.         ENDP
  80.  
  81. ;========================================
  82. ; Upload an xmodem file.
  83. ;
  84. ; In: AX= name of file; BX= serial
  85. ;     record; CL= xmodem flags.
  86.  
  87. XmdUpl  PROC    NEAR
  88.         push    bp
  89.         push    di
  90.         push    si
  91.  
  92.         mov     di, bx
  93.         StkAll  bp, 1024                ;allocate xmodem data record
  94.         StkAll  si, BUFFER_RECORD       ;allocate file buffer record
  95.  
  96.         call    _xmod_init      ;initialize
  97.  
  98. ;--- create buffer and open file
  99.  
  100.         push    ax
  101.         mov     ax, _XMOD_BUF   ;buffer size
  102.         mov     bx, si
  103.         call    BufAll          ;allocate buffer
  104.         pop     ax
  105.         jc      _xdupl3
  106.  
  107.         mov     bx, si
  108.         mov     cl, BUFFER_READ ;access
  109.         call    BufOpn          ;try to open
  110.         jc      _xdupl5
  111.  
  112. ;--- handshake
  113.  
  114. _xdupl1 sub     al, al          ;action
  115.         call    _xmod_stat      ;update status
  116.         jc      _xdupl2         ;jump if abort
  117.  
  118.         mov     bx, di          ;serial record
  119.         mov     cl, _xmod_flg   ;load flags
  120.         call    XmdPutH         ;complete handshake
  121.         mov     _xmod_flg, cl   ;save flags
  122.         jnc     _xdupl7         ;jump if okay
  123.  
  124.         call    _xmod_error     ;process error
  125.         jmps    _xdupl1         ;loop back
  126.  
  127. _xdupl2 jmp     _xduplE         ;jump if abort
  128.  
  129. ;--- not enough memory
  130.  
  131. _xdupl3 mov     bp, XMODEM_MEMORY
  132.         jmp     _xduplF
  133.  
  134. ;--- file error
  135.  
  136. _xdupl4 mov     bx, si
  137.         call    BufClo
  138. _xdupl5 mov     bx, si
  139.         call    BufRel
  140.         mov     bp, XMODEM_FILE
  141.         jmp     _xduplF
  142.  
  143. ;--- byte not returned reading file
  144.  
  145. _xdupl6 or      _xmod_flg, XMODEM_EOF   ;set EOF flag (in case not error)
  146.         or      al, al                  ;check if EOF (error code 0)
  147.         jz      _xduplA                 ;jump if so
  148.         pop     ax                      ;
  149.         pop     ax                      ;fix stack
  150.         jmps    _xdupl4                 ;goto error terminate
  151.  
  152. ;--- read block
  153.  
  154. _xdupl7 test    _xmod_flg, XMODEM_EOF   ;check if end of file
  155.         jnz     _xduplC                 ;jump if so
  156.  
  157.         mov     cx, 128                 ;128 bytes
  158.         test    _xmod_flg, XMODEM_BIG   ;check if big blocks
  159.         jz      _xdupl8
  160.         mov     cx, 1024                ;1024 bytes
  161.  
  162. _xdupl8 push    cx
  163.         push    di
  164.         mov     di, bp          ;data buffer
  165.  
  166. ;--- read/store loop
  167.  
  168. _xdupl9 mov     bx, si          ;input record
  169.         push    cx
  170.         call    GetByt          ;read byte
  171.         pop     cx
  172.         jc      _xdupl6         ;jump if no byte returned
  173.         cld
  174.         stosb                   ;store byte
  175.         loop    _xdupl9         ;loop
  176.  
  177. ;--- done reading block
  178.  
  179. _xduplA mov     dx, cx          ;save bytes not written
  180.         sub     al, al
  181.         cld
  182.         rep
  183.         stosb                   ;fill with zeros
  184.         pop     di
  185.         pop     ax              ;restore block size
  186.         cmp     ax, dx          ;check if any bytes read
  187.         je      _xduplC         ;don't send block if not
  188.  
  189.         add     _xmod_blk1, 1   ;
  190.         adc     _xmod_blk2, 0   ;increment block number
  191.         add     _xmod_byt1, ax  ;
  192.         adc     _xmod_byt2, 0   ;update bytes read
  193.  
  194. ;--- send block
  195.  
  196. _xduplB mov     ax, bp                  ;block data
  197.         mov     bx, di                  ;serial record
  198.         mov     cl, _xmod_flg           ;flags
  199.         mov     ch, BYTE _xmod_blk1     ;block number
  200.         call    XmdPut                  ;send block
  201.  
  202. ;--- wait for reply
  203.  
  204.         mov     al, 1           ;action
  205.         call    _xmod_stat      ;update status
  206.         jc      _xduplE         ;jump if abort
  207.  
  208.         mov     bx, di          ;serial record
  209.         mov     cl, _xmod_flg   ;flags
  210.         call    XmdRep          ;wait for reply
  211.         jnc     _xdupl7         ;jump if okay
  212.  
  213.         call    _xmod_error     ;process error
  214.         jmps    _xduplB         ;loop back
  215.  
  216. ;--- send EOT
  217.  
  218. _xduplC mov     al, 1           ;action
  219.         call    _xmod_stat      ;update status
  220.         jc      _xduplE         ;jump if abort
  221.  
  222.         mov     al, XMODEM_EOT
  223.         mov     bx, di
  224.         call    ComPut
  225.  
  226. ;--- wait for reply
  227.  
  228.         mov     al, 1           ;action
  229.         call    _xmod_stat      ;update status
  230.         jc      _xduplE         ;jump if abort
  231.  
  232.         mov     bx, di          ;serial record
  233.         mov     cl, _xmod_flg   ;flags
  234.         call    XmdRep          ;wait for reply
  235.         jnc     _xduplD         ;jump if okay
  236.  
  237.         call    _xmod_error     ;process error
  238.         jmps    _xduplC         ;loop back
  239.  
  240. ;--- finished
  241.  
  242. _xduplD mov     bx, si
  243.         call    BufClo                  ;close buffer
  244.  
  245.         mov     bx, si
  246.         call    BufRel                  ;release buffer
  247.  
  248.         StkRel  BUFFER_RECORD + 1024    ;fix stack
  249.         pop     si
  250.         pop     di
  251.         pop     bp
  252.         clc
  253.         ret
  254.  
  255. ;--- user abort
  256.  
  257. _xduplE mov     bx, si
  258.         call    BufClo
  259.         mov     bx, si
  260.         call    BufRel
  261.         mov     bp, XMODEM_ABORT
  262.  
  263. _xduplF mov     ax, bp
  264.         StkRel  BUFFER_RECORD + 1024    ;fix stack
  265.         pop     si
  266.         pop     di
  267.         pop     bp
  268.         stc
  269.         ret
  270.         ENDP
  271.  
  272. ;========================================
  273. ; Download an xmodem file.
  274. ;
  275. ; In: AX= name of file; BX= serial
  276. ;     record; CL= xmodem flags.
  277.  
  278. XmdDwn  PROC    NEAR
  279.         push    bp
  280.         push    di
  281.         push    si
  282.  
  283.         mov     di, bx
  284.         StkAll  bp, 1024                ;allocate xmodem data record
  285.         StkAll  si, BUFFER_RECORD       ;allocate file buffer record
  286.  
  287.         call    _xmod_init      ;initialize
  288.  
  289. ;--- open file
  290.  
  291.         push    ax
  292.         mov     ax, _XMOD_BUF   ;buffer size
  293.         mov     bx, si
  294.         call    BufAll          ;allocate buffer
  295.         pop     ax
  296.         jc      _xddwn7
  297.  
  298.         mov     bx, si
  299.         mov     cl, BUFFER_CREATE       ;access
  300.         call    BufOpn                  ;try to open
  301.         jc      _xddwn9
  302.  
  303. ;--- handshake
  304.  
  305. _xddwn1 sub     al, al          ;action
  306.         call    _xmod_stat      ;update status
  307.         jc      _xddwn2         ;jump if abort
  308.  
  309.         mov     bx, di          ;serial record
  310.         mov     cl, _xmod_flg   ;flags
  311.         call    XmdGetH         ;complete handshake
  312.         jnc     _xddwn3         ;jump if okay
  313.  
  314.         call    _xmod_error                     ;process error
  315.         cmp     _xmod_err, 5                    ;check if 5 or more timeouts
  316.         jbe     _xddwn1                         ;loop back if not
  317.         and     _xmod_flg, NOT XMODEM_CRC       ;clear CRC flag
  318.         jmps    _xddwn1                         ;loop back
  319.  
  320. _xddwn2 jmp     _xddwnE
  321.  
  322. ;--- wait for block
  323.  
  324. _xddwn3 inc     _xmod_blk1      ;increment block number
  325.         jnz     _xddwn4         ;jump if skip carry
  326.         inc     _xmod_blk2      ;increment high word if overflow
  327.  
  328. _xddwn4 mov     al, 1           ;action
  329.         call    _xmod_stat      ;update status
  330.         jc      _xddwn2         ;jump if abort
  331.  
  332.         mov     ax, bp                  ;block data
  333.         mov     bx, di                  ;serial record
  334.         mov     cl, _xmod_flg           ;flags
  335.         mov     ch, BYTE _xmod_blk1     ;block number
  336.         call    XmdGet                  ;receive block
  337.         jnc     _xddwnA                 ;jump if okay
  338.  
  339.         call    _xmod_error             ;process error
  340.  
  341.         cmp     al, XMODEM_LAST         ;check if duplicated block
  342.         jne     _xddwn5                 ;jump if not
  343.         mov     al, XMODEM_ACK          ;ACK
  344.         call    ComPut                  ;send it
  345.         jmps    _xddwn4                 ;loop back
  346.  
  347. _xddwn5 cmp     al, XMODEM_TIME         ;check if timeout
  348.         je      _xddwn6                 ;skip clear if so
  349.         call    XmdClr                  ;clear pipe
  350. _xddwn6 mov     al, XMODEM_NAK          ;NAK
  351.         call    ComPut                  ;send it
  352.         jmps    _xddwn4                 ;loop back
  353.  
  354. ;--- not enough memory
  355.  
  356. _xddwn7 mov     bp, XMODEM_MEMORY
  357.         jmps    _xddwnF
  358.  
  359. ;--- couldn't open file
  360.  
  361. _xddwn8 pop     di
  362.         mov     bx, si
  363.         call    BufClo
  364. _xddwn9 mov     bx, si
  365.         call    BufRel
  366.         mov     bp, XMODEM_FILE
  367.         jmps    _xddwnF
  368.  
  369. ;--- write block
  370.  
  371. _xddwnA push    ax
  372.         mov     al, XMODEM_ACK  ;ACK
  373.         call    ComPut          ;send it
  374.         pop     ax
  375.  
  376.         cmp     al, XMODEM_END  ;check if end of file
  377.         je      _xddwnD
  378.         mov     cx, 128         ;128 bytes
  379.         cmp     al, XMODEM_128  ;check 128 byte block
  380.         je      _xddwnB
  381.         mov     cx, 1024        ;1024 bytes
  382.  
  383. _xddwnB add     _xmod_byt1, cx  ;
  384.         adc     _xmod_byt2, 0   ;update bytes written
  385.         push    di
  386.         mov     di, bp          ;start of buffer
  387. _xddwnC mov     al, [di]        ;load byte
  388.         inc     di              ;increment pointer
  389.         mov     bx, si          ;buffer record
  390.         push    cx
  391.         call    PutByt          ;write byte
  392.         pop     cx
  393.         jc      _xddwn8         ;jump if error
  394.         loop    _xddwnC         ;loop for each byte
  395.         pop     di
  396.         jmp     _xddwn3         ;loop back for next block
  397.  
  398. ;--- finished
  399.  
  400. _xddwnD mov     bx, si
  401.         call    BufPut          ;flush buffer
  402.         mov     bx, si
  403.         call    BufClo          ;close buffer
  404.         mov     bx, si
  405.         call    BufRel          ;release buffer
  406.  
  407.         StkRel  BUFFER_RECORD + 1024    ;fix stack
  408.         pop     si
  409.         pop     di
  410.         pop     bp
  411.         clc
  412.         ret
  413.  
  414. ;--- user abort
  415.  
  416. _xddwnE mov     bx, si
  417.         call    BufClo
  418.         mov     bx, si
  419.         call    BufRel
  420.         mov     bp, XMODEM_ABORT
  421.  
  422. _xddwnF mov     ax, bp
  423.         StkRel  BUFFER_RECORD + 1024    ;fix stack
  424.         pop     si
  425.         pop     di
  426.         pop     bp
  427.         stc
  428.         ret
  429.         ENDP
  430.  
  431. _xmodem2_end
  432.